package com.hmall.item.es;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.json.JSONUtil;
import com.hmall.item.constants.EsConstant;
import com.hmall.item.domain.dto.ItemDTO;
import com.hmall.item.domain.po.ItemDoc;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.time.LocalDateTime;

@Component
@Slf4j
@AllArgsConstructor
public class EsOperating {
    private final RestHighLevelClient restHighLevelClient;

    /**
     - 1）创建Request对象，这里是IndexRequest，因为添加文档就是创建倒排索引的过程
     - 2）准备请求参数，本例中就是Json文档
     - 3）发送请求
     */
    public void addItemToIndex(ItemDTO itemDTO) {
        // 创建Request对象
        log.info("添加商品到Es库，商品Id为：" + itemDTO.getId());
        IndexRequest request = new IndexRequest(EsConstant.ITEM_INDEX);
        // 设置参数
        request.id(itemDTO.getId().toString());
        // 将对象转为 Json
        // 1. DTO转为DOC
        ItemDoc itemDoc = BeanUtil.copyProperties(itemDTO, ItemDoc.class);
        // 2.补充完整更新时间
        itemDoc.setUpdateTime(LocalDateTime.now());
        // 3.将DOC转为Json
        request.source(JSONUtil.toJsonStr(itemDoc), XContentType.JSON);
        try {
            // 4.发送请求
            restHighLevelClient.index(request, RequestOptions.DEFAULT);
        } catch (IOException e) {
            log.info("添加商品到Es库出错：{}", e.getMessage());
        }
    }

    public void removeItemByIndex(ItemDTO itemDTO) {
        //直接根据文档Id删除索引库中的商品
        log.info("删除Es库中的商品，对应Id为：" + itemDTO.getId());
        // 准备Request对象
        DeleteRequest request = new DeleteRequest(EsConstant.ITEM_INDEX);
        // 准备参数    设置删除文档Id
        request.id(itemDTO.getId().toString());
        try {
            // 发送请求
            restHighLevelClient.delete(request, RequestOptions.DEFAULT);
        } catch (IOException e) {
            log.info("删除Es库中的商品出错：{}", e.getMessage());
        }
    }

    public void updateItemByIndex(ItemDTO itemDTO) {
        log.info("更新Es库中的商品，对应Id为：" + itemDTO.getId());
        // 创建Request对象
        UpdateRequest request = new UpdateRequest(EsConstant.ITEM_INDEX, itemDTO.getId().toString());
        // 将对象转为 Json
        // 1. DTO转为DOC
        ItemDoc itemDoc = BeanUtil.copyProperties(itemDTO, ItemDoc.class);
        // 2.补充完整更新时间
        itemDoc.setUpdateTime(LocalDateTime.now());
        // 3.将DOC转为Json
        request.doc(JSONUtil.toJsonStr(itemDoc), XContentType.JSON);
        // 发送请求
        try {
            restHighLevelClient.update(request, RequestOptions.DEFAULT);
        } catch (IOException e) {
            log.info("更新Es库中的商品出错：{}", e.getMessage());
        }
    }
}
